package com.cloud.cloudshop.provider;

import com.alibaba.fastjson.JSON;
import com.cloud.cloudshop.shop.constant.Constants;
import com.cloud.cloudshop.shop.dao.OrderDao;
import com.cloud.cloudshop.shop.dao.OrderMessageDao;
import com.cloud.cloudshop.util.DateUtils;
import com.cloud.common.entity.OrderEntity;
import com.cloud.common.entity.OrderMessageEntity;
import com.cloud.common.utils.IDUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;

/**
 * @Author : Luojie
 * @CreateTime : 2019/9/3
 * @Description :
 **/
@RestController
public class RabbitCreateOrderAndSend {

    private final RabbitOrderSender rabbitOrderSender;

    private final OrderDao orderDao;

    private final OrderMessageDao orderMessageDao;

    @Autowired
    public RabbitCreateOrderAndSend(OrderDao orderDao, OrderMessageDao orderMessageDao, RabbitOrderSender rabbitOrderSender) {
        this.orderMessageDao = orderMessageDao;
        this.orderDao = orderDao;
        this.rabbitOrderSender = rabbitOrderSender;
    }


    public void createOrderByDirectExchange(OrderEntity order) throws Exception {
        // 使用当前时间当做订单创建时间（为了模拟一下简化）
        Date orderTime = new Date();
        // 插入业务数据
        orderDao.insert(order);
        // 插入消息记录表数据
        OrderMessageEntity brokerMessageLog = new OrderMessageEntity();
        // 消息唯一ID
        brokerMessageLog.setId(IDUtils.getStringId());
        brokerMessageLog.setMessageId(order.getMessageId());
        // 保存消息整体 转为JSON 格式存储入库
        brokerMessageLog.setMessage(JSON.toJSONString(order));
        // 设置消息状态为0 表示发送中
        brokerMessageLog.setStatus("0");
        // 设置消息未确认超时时间窗口为 一分钟
        brokerMessageLog.setNextRetry(DateUtils.addMinutes(orderTime, Constants.ORDER_TIMEOUT));
        orderMessageDao.insert(brokerMessageLog);
        // 发送消息
        rabbitOrderSender.sendOrderByDirectExchange(order);
    }


    public void createOrderByTopicExchange(OrderEntity order) {

        // 使用当前时间当做订单创建时间（为了模拟一下简化）
        Date orderTime = new Date();
        // 插入业务数据
        orderDao.insert(order);
        // 插入消息记录表数据
        OrderMessageEntity brokerMessageLog = new OrderMessageEntity();
        // 消息唯一ID
        brokerMessageLog.setId(IDUtils.getStringId());
        brokerMessageLog.setMessageId(order.getMessageId());
        // 保存消息整体 转为JSON 格式存储入库
        brokerMessageLog.setMessage(JSON.toJSONString(order));
        // 设置消息状态为0 表示发送中
        brokerMessageLog.setStatus("0");
        // 设置消息未确认超时时间窗口为 一分钟
        brokerMessageLog.setNextRetry(DateUtils.addMinutes(orderTime, Constants.ORDER_TIMEOUT));
        orderMessageDao.insert(brokerMessageLog);
        // 发送消息
        rabbitOrderSender.sendOrderByTopicExchange(order);

    }

    public void createOrderByFanoutExchange(OrderEntity order) {

        // 使用当前时间当做订单创建时间（为了模拟一下简化）
        Date orderTime = new Date();
        // 插入业务数据
        orderDao.insert(order);
        // 插入消息记录表数据
        OrderMessageEntity brokerMessageLog = new OrderMessageEntity();
        // 消息唯一ID
        brokerMessageLog.setId(IDUtils.getStringId());
        brokerMessageLog.setMessageId(order.getMessageId());
        // 保存消息整体 转为JSON 格式存储入库
        brokerMessageLog.setMessage(JSON.toJSONString(order));
        // 设置消息状态为0 表示发送中
        brokerMessageLog.setStatus("0");
        // 设置消息未确认超时时间窗口为 一分钟
        brokerMessageLog.setNextRetry(DateUtils.addMinutes(orderTime, Constants.ORDER_TIMEOUT));
        orderMessageDao.insert(brokerMessageLog);
        // 发送消息
        rabbitOrderSender.sendOrderByFanoutExchange(order);

    }
}